import numpy as np
import torch.nn as nn
import torch
class net:
    def __init__(self):
        #我们要一个1*4的矩阵作为输入和一个4*1的权重作为ABCD
        self.ABCD = np.mat(np.random.rand(4,1))
        self.paranum = 4


    def forward(self,xyz):
        inputmat = np.mat([xyz[0],xyz[1],xyz[2],1.])
        return inputmat * self.ABCD

    def getpara(self,i,j):
        return self.ABCD[i,j]

    def setpara(self,i,j,num):
        self.ABCD[i,j] = num


#传统梯度下降模块
class ournet(nn.Module):
    def __init__(self):
        #TODO 现在的情况是把表面初始化在外面就会导致非叶节点？
        #TODO 懒人有懒活，考虑把采样点带上极性，不妨假设平面A侧极性为正，平面B侧极性为负 
        #TODO 则平面一定会朝着B侧移动，直到B侧无点，这时候可以认为平面在外侧 
        #TODO 或者我们给表面点带上奇怪的信息？
        #TODO 不能施加随机扰动，这是不合理的。
        #TODO 首先————把平面移出来，然后解决局部最优的问题。
        #不能指望多次进入退出的过程能让平面最后平整的贴合在物体表面上。
        #距离平方反比。。。支持力。。。正负引力
        #采样点的属性要和距离产生关系？


        super(ournet, self).__init__()
        self.net = nn.Linear(4, 1, False)
        print('123')
        print(self.net.weight)
        print(self.net.weight[0][0])
        # temp = torch.zeros(1,4)
        # temp[0,0] = 1
        # print(temp)
        # self.net.weight = nn.Parameter(temp)
        print(self.net.weight[0][0])
        print(self.net.weight)
        print('123')
        #self.net.weight.fill_()

    def forward(self, point):
        return self.net(point)

    def setpara(self, plane):
        temp = torch.zeros(1,4)
        temp[0,0] = plane[0]
        temp[0,1] = plane[1]
        temp[0,2] = plane[2]
        temp[0,3] = plane[3]
        temp = temp.cuda()
        self.net.weight = nn.Parameter(temp)
        print(self.net.weight)
